package com.woniu.teachmall.controller;

import com.woniu.teachmall.entity.Goods;
import com.woniu.teachmall.entity.User;
import com.woniu.teachmall.service.GoodsService;
import com.woniu.teachmall.service.MinioService;
import com.woniu.teachmall.service.UserService;
import com.woniu.teachmall.service.service.AdminService;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

@Controller
@RequestMapping("/admin")
public class AdminController {

    @Autowired
    MinioService minioService; // 用于文件上传的服务
    @Autowired
    AdminService adminService; // 管理员相关的服务
    @Autowired
    UserService userService; // 用户管理服务

    @Autowired
    GoodsService goodsService; // 商品管理服务

    /**
     * 管理员主页入口
     * @param session 当前会话，检查是否为管理员
     * @return 管理员主页或重定向到首页
     */
    @GetMapping("")
    public String admin(HttpSession session) {
        // 获取当前会话中的登录用户
        User user = (User) session.getAttribute("loginUser");
        // 判断用户是否存在且为管理员
        if (user == null || !user.getAccount().equals("admin")) {
            return "redirect:/"; // 如果不是管理员，重定向到首页
        }
        return "admin"; // 返回管理员主页视图
    }

    /**
     * 进入商品添加页面
     * @return 商品添加页面视图
     */
    @GetMapping("/good/add")
    public String goodadd() {
        return "goods_add"; // 返回商品添加页面
    }

    /**
     * 添加商品
     * @param goods 商品对象
     * @return 添加成功信息
     */
    @PostMapping("/good/add")
    public String addGoods(@RequestBody Goods goods) {
        goodsService.addGoods(goods); // 调用服务层添加商品
        return "商品添加成功"; // 返回商品添加成功的信息
    }

    /**
     * 上传商品图片
     * @param file 图片文件
     * @param model Spring Model，用于传递数据到视图
     * @param session 当前会话，检查是否为管理员
     * @return 图片上传后的URL
     * @throws Exception 处理文件上传时可能的异常
     */
    @PostMapping("/upload/good")
    @ResponseBody
    public String uploadGood(@RequestParam MultipartFile file, Model model, HttpSession session) throws Exception {
        // 获取当前会话中的登录用户
        User user = (User) session.getAttribute("loginUser");
        // 如果不是管理员，重定向到登录页面
        if (user == null || !user.getAccount().equals("admin")) {
            return "redirect:/user/login";
        }
        // 调用MinioService上传文件并返回文件的URL
        String url = minioService.uploadFile(file);
        model.addAttribute("url", url); // 将URL传递给视图
        return url; // 返回图片的URL
    }

    /**
     * 进入普通用户管理页面
     * @param model Spring Model，用于传递数据到视图
     * @return 用户列表页面视图
     */
    @GetMapping("/user/list")
    public String userList(Model model) {
        // 获取所有用户列表
        List<User> userlist = adminService.getAllUser();
        model.addAttribute("userlist", userlist); // 将用户列表传递到视图
        return "admin_list"; // 返回用户列表页面视图
    }

    /**
     * 冻结用户
     * @param id 用户ID
     * @return 重定向到用户列表页面
     */
    @GetMapping("/user/freeze")
    public String freeze(@RequestParam Integer id) {
        // 调用服务层冻结用户
        boolean success = userService.freezeUser(id);
        return "redirect:/admin/user/list"; // 冻结后返回用户列表页面
    }

    /**
     * 解冻用户
     * @param id 用户ID
     * @return 重定向到用户列表页面
     */
    @GetMapping("/user/unfreeze")
    public String unfreeze(@RequestParam Integer id) {
        // 调用服务层解冻用户
        boolean success = userService.unfreezeUser(id);
        return "redirect:/admin/user/list"; // 解冻后返回用户列表页面
    }

    /**
     * 将用户加入黑名单
     * @param id 用户ID
     * @return 重定向到用户列表页面
     */
    @GetMapping("/user/blacklist/add")
    public String addToBlacklist(@RequestParam Integer id) {
        // 调用服务层将用户加入黑名单
        boolean success = userService.addToBlacklist(id);
        return "redirect:/admin/user/list"; // 加入黑名单后返回用户列表页面
    }

    /**
     * 从黑名单中移除用户
     * @param id 用户ID
     * @return 重定向到用户列表页面
     */
    @GetMapping("/user/blacklist/remove")
    public String removeFromBlacklist(@RequestParam Integer id) {
        // 调用服务层从黑名单中移除用户
        boolean success = userService.removeFromBlacklist(id);
        return "redirect:/admin/user/list"; // 移除黑名单后返回用户列表页面
    }

    /**
     * 删除用户
     * @param id 用户ID
     * @return 重定向到用户列表页面
     */
    @GetMapping("/user/delete")
    public String delete(@RequestParam Integer id) {
        // 调用服务层删除用户
        boolean success = userService.deleteUser(id);
        return "redirect:/admin/user/list"; // 删除用户后返回用户列表页面
    }
}
